package com.j.lemon.learn.jvm;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * @Author lijunjun
 * @Date 2019-05-30 11:19
 * @Description java类加载器分为两大类，
 *              一类是虚拟机自带的加载器：
 *                     1。启动类加载器（Bootstrap）
 *                           加载的类的路径：$JAVA_HOME/jre/lib/rt.jar
 *                     2。扩展类加载器（Extension）
 *                           加载的类的路径：$JAVA_home/jre/lib/ext/*.jar
 *                     3。应用程序类加载器（App）
 *                           加载的类的路径：$CLASSPATH
 *                           也叫系用类加载器，加载当前应用的classpath的所有类 ，target/classes目录
 *              二类是用户自定义的类加载器
 *
 *
 *              双亲委派机制：当某个类加载器要进行类的加载时，会将加载任务交给父类加载器，如果父类加载器可以完成类加载任务，就成功返回，只有父类加载器
 *                          无法完成类的加载时，才自己去加载。
 *
 *                          为什么？
 *                          防止恶意代码对java原声代码的破坏，无法模拟写出一个java.lang.String类，因为应用程序类加载器在加载自己写的String类时，
 *                          会委托父类先去加载，因为在启动类加载器中已经加载了原生的String类，所以自己写的String类就不会被加载进去
 */
public class ClassLoaderDemo {
    private static native void doH();

    public static void main(String[] args) throws ClassNotFoundException, IOException {
//        doH();
        ClassLoader parent = ClassLoader.getSystemClassLoader();
        Class<?> aClass = parent.loadClass("");
        System.out.println(aClass.getName());

        URL url = new URL("");
        InputStream inputStream = url.openStream();

    }
}
